package com.liveinstars.im.domain.manager;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liveinstars.im.domain.dao.model.ChatGroupMember;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 聊天群成员组织 服务类
 * </p>
 *
 * @author 8btc
 * @since 2020-03-31
 */
public interface ChatGroupMemberManager extends IService<ChatGroupMember> {

    /**
     * 根据用户id查询所属圈子的id列表
     * @param userId
     * @param groupType
     * @return
     */
    List<Long> listChatGroupIdByUserIdAndGroupType(Long userId, Integer groupType);

    /**
     * 根据用户id和圈子类型查询圈子成员信息
     * @param userId
     * @param groupType
     * @return
     */
    List<ChatGroupMember> listByUserIdAndGroupType(Long userId, Integer groupType);

    /**
     * 根据圈子id获取圈子中未被屏蔽的成员列表
     * @param chatGroupId
     * @return
     */
    List<ChatGroupMember> listUnshieldMemberByChatGroupId(Long chatGroupId);

    /**
     * 获取圈子成员列表
     * @param chatGroupId
     * @return
     */
    List<ChatGroupMember> listMemberByChatGroupId(Long chatGroupId);

    /**
     * 根据圈子id和用户id获取成员记录
     * @param chatGroupId
     * @param userId
     * @return
     */
    ChatGroupMember getChatGroupMemberByGroupIdAndUserId(Long chatGroupId, Long userId);

    /**
     * 删除群成员
     * @param chatGroupId
     * @param userId
     */
    void deleteMemberByChatGroupIdAndUserId(Long chatGroupId, Long userId);

    /**
     * 删除群内所有成员
     * @param chatGroupId
     */
    void deleteMemberByChatGroupId(Long chatGroupId);

    /**
     * 获取当前群人数
     * @param chatGroupId
     * @return
     */
    int countByChatGroupId(Long chatGroupId);

    /**
     * 批量删除群成员
     * @param chatGroupId
     * @param userIdList
     */
    void deleteMemberByChatGroupIdAndUserIdList(Long chatGroupId, List<Long> userIdList);

    /**
     * 获取圈子成员数Map
     * @param chatGroupIdList
     * @return
     */
    Map<Long, Integer> mapMemberCountByChatGroupIdList(List<Long> chatGroupIdList);

    /**
     * 屏蔽圈子
     * @param userId
     * @param chatGroupId
     * @param shield
     */
    void updateShield(Long userId, Long chatGroupId, boolean shield);

    /**
     * 批量添加好友会话用户
     * @param list
     */
    void batchSaveFriendMember(List<ChatGroupMember> list, Long chatGroupId);

    /**
     * 批量添加圈子会话用户
     * @param list
     * @param chatGroupId
     */
    void batchSaveMember(List<ChatGroupMember> list, Long chatGroupId);

    /**
     * 保存群成员
     * @param chatGroupMember
     */
    void saveChatGroupMember(ChatGroupMember chatGroupMember);

    /**
     * 反向更新屏蔽状态
     * @param userId
     * @param chatGroupId
     */
    void updateReverseShieldByUserIdAndChatGroupId(Long userId, Long chatGroupId);

    /**
     * 根据userId和chatGroupId更新数据
     * @param chatGroupMember
     * @param userId
     * @param chatGroupId
     */
    void updateByUserIdAndChatGroupId(ChatGroupMember chatGroupMember, Long userId, Long chatGroupId);
}
